#ifndef MESSAGE_H_
#define MESSAGE_H_
#include <string>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <pthread.h>
#include "../Utils/hmac.h"
using namespace std;

class Message {
protected:
	string msg; //mensaje
	char id; //id de mensaje
	/*indica si es un mensaje de register, o informacion del logueo(loggingOk, loginError..)
	En estos casos no es necesaria la firma del mensaje*/
	bool is_type_logging;

public:
	string user;
	string pass;

	Message(char id,bool is_type_logging) {
			this->id = id;
			this->is_type_logging=is_type_logging;
		}
	Message(char id){
		this->id = id;
		is_type_logging=false;
	}

	Message(char id,string user,string pass) {
		this->id = id;
		this->user=user;
		this->pass=pass;
		is_type_logging=false;
	}
	virtual ~Message() {
	}
	;

	//Formatea el mensaje en base a los parametros
	virtual string Format()=0;

	//Pasa el mensaje a un string, agregandole la longitud y su id.
	string MsgToString() {
		msg = Format();
		if(not is_type_logging){
			msg= HMAC(msg,user,pass);
		}
		//Obtengo la longitud del msg sin el id y paso a codificacion de la red
		uint32_t length = htonl(msg.size());
		//Convierto el entero en 4 chars para poder mandarlo
		char* ptr = (char*) (&length);
		//Agrego la longitud
		for (int i = sizeof(uint32_t) - 1; i >= 0; i--) {
			msg = ptr[i] + msg;
		}
		//Agrego al principio la id del msg
		msg = id + msg;
		return msg;
	}

	// Setea nombre de usuario, necesario para la firma
	void setUser(string user){
		this->user=user;
	}
	// Setea contraseña del usuario, necesario para la firma
	void setPass(string pass){
		this->pass = pass;
	}
};

#endif /* MESSAGE_H_ */
